using System;
using System.Collections.Generic;
using System.Xml;
using System.Collections.ObjectModel;

namespace planning
{
	public class Matiere : Ressource
	{
		// ----- ATTRIBUTS -----
		private string titre;
		private ICollection<Enseignant> enseignants = new ObservableCollection<Enseignant>();

		// ----- CONSTRUCTEURS -----
		public Matiere()
		{
			// Start of user code for default constructor
			// End of user code for default constructor
		}

		// ----- ACCESSEURS -----
		public string Titre
		{
			get { return titre; }
			set { titre = value; ObjectChanged("titre"); }
		}

		public ICollection<Enseignant> Enseignants
		{
			get { return enseignants; }
			set { enseignants = value; ObjectChanged("enseignants"); }
		}


		private static Dictionary<string, Matiere> references = new Dictionary<string, Matiere>();

		public static new Matiere fromXml(XmlNode node)
		{
			Matiere matiere;
			XmlNode refAttribute = node.SelectSingleNode("@ref");
			XmlNode idAttribute = node.SelectSingleNode("@id");

			if(refAttribute != null) {
				if(references.ContainsKey(refAttribute.Value)) {
					return references[refAttribute.Value];
				} else {
					matiere = new Matiere();
					references.Add(refAttribute.Value, matiere);
					return matiere;
				}
			}

			if(idAttribute != null && references.ContainsKey(idAttribute.Value)) {
				matiere = references[idAttribute.Value];
			} else {
				matiere = new Matiere();

				if(idAttribute != null) {
					references.Add(idAttribute.Value, matiere);
				}
			}

			if(node.SelectSingleNode("@titre") != null)
				matiere.Titre = node.SelectSingleNode("@titre").Value;

			foreach (XmlNode subElement in node.SelectNodes("enseignants/*"))
			{
				Enseignant subObject = Enseignant.fromXml(subElement);
				matiere.Enseignants.Add(subObject);
			}

			

			return matiere;

		}

        public string Ref
        {
            get
            {
                return "mat-" + Titre.ToLower();
            }
        }

        public override XmlElement toXml(XmlDocument document)
		{
            // Start of user code for toXml
            XmlElement element = document.CreateElement("Matiere");
            XmlAttribute refAttribute = document.CreateAttribute("id");
            refAttribute.Value = Ref;
            element.Attributes.Append(refAttribute);

            XmlAttribute titreAttribute = document.CreateAttribute("titre");
            titreAttribute.Value = Titre;
            element.Attributes.Append(titreAttribute);

            XmlElement enseignantsElement = document.CreateElement("enseignants");
            element.AppendChild(enseignantsElement);
            foreach (Enseignant subObject in Enseignants)
            {
                XmlElement enseignant = document.CreateElement("Enseignant");
                XmlAttribute refEnseignantAttribute = document.CreateAttribute("ref");
                refEnseignantAttribute.Value = subObject.Ref;
                enseignant.Attributes.Append(refEnseignantAttribute);
                enseignantsElement.AppendChild(enseignant);
            }

            return element;
			// End of user code for toXml
		}


	}

}
